#ifndef _AFFICHAGESDL_H_
#define _AFFICHAGESDL_H_

#include "Jeu.h"

#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>

/**
 * @struct Input structure input
 * @brief Structure Input
 * @details	la structure contient les evenements possible (l'event passe à 1 quand il a été activé)
 * @param key: un tableau comprenand toutes les touches du clavier
 * @param mousex, mousey: la position d'un clic de souris
 * @param mousebuttons: les differents evenements possible avec la souris (clic gauche, droit, mollette...)
*/
struct sInput
{
    char key[SDLK_LAST];
    int mousex,mousey;
    char mousebuttons[8];
};
typedef struct sInput Input;

/**
 * @struct AffichageSdl structure AffichageSdl
 * @brief Structure AffichageSdl
 * @details	la structure contient les differentes surface utilisées, des variables d'affichage
 * @param affTableau, affCarte: booleen indiquant si le tableau de question/les cartes piochées doivent etre affichés ou pas
 * @param ecran: la surface principale
 * @param SurfacePlateau: la surface de gauche
 * @param SurfaceScore: la surface de droite
 * @param SurfaceTableau: l'image du tableau où s'affiche les questions
 * @param surfaceCases: l'image du plateau de jeu (avec les cases)
 * @param texte: une surface qui permet de blitter les differents textes à afficher
 * @param imagesPion: un tableau comprenant les images de pions
 * @param imagesCarte: un tableau comprenant toutes les cartes (taille Grande)
 * @param imagesCarteMini: un tableau comprenant toutes les miniature des cartes (pour l'affichage de la main des joueurs)
 * @param nbImgPion/nbImgCarte: le nombre d'images dans les tableaux d'images
 * @param police: contient une police de caractère
 * @param posBonneRep: la position (1/2/3/4) pour comparer lors d'un clic sur l'ecran
 * @param piocheCarte: un pointeur vers la carte piochée (utlisée dans les fonction affichageCarte
 * @param phraseEtat: chaine de caractere indiquant l'etat du jeu
*/
struct sAffichageSdl
{
    bool affTableau;
    bool affCarte;

    int tailleXEcran;
    int tailleYEcran;
    int tailleCase;

    SDL_Surface *ecran;
    SDL_Surface *SurfacePlateau;
    SDL_Surface *SurfaceScore;
    SDL_Surface *SurfaceTableau;
    SDL_Surface *surfaceCases;
    SDL_Surface *texte;
    SDL_Surface** imagesPion;
    int nbImgPion;
    SDL_Surface** imagesCarte;
    int nbImgCarte;
    SDL_Surface** imagesCarteMini;

    TTF_Font *police;

    int posBonneRep;
    Carte *piocheCarte;

    char *phraseEtat;
};
typedef struct sAffichageSdl AffichageSdl;


/**
 * @brief creerAffichageSdl alloue un affichage
 * @return une structure AffichageSdl
*/
AffichageSdl * creerAffichageSdl();
/**
 * @brief initAffichageSdl charge SDL, toutes les images
 * @param [in-out] *Affichage à initialiser
 * @return none
*/
void initAffichageSdl(AffichageSdl *);
/**
 * @brief libereAffichageSdl libère toutes les surfaces
 * @param [in-out] *Affichage à liberer
 * @return none
*/
void libereAffichageSdl(AffichageSdl *);
/**
 * @brief detruitAffichageSdl fait appel a libereAffichageSdl et libere la structure
 * @param [in-out] **Affichage a detruire
 * @return none
*/
void detruitAffichageSdl(AffichageSdl **);

/**
 * @brief charge les images dans les tableaux de surface
 * @param [in-out] *Affichage à remplir
 * @return none
*/
void LoadAll(AffichageSdl *);

/**
 * @brief Modifie la valeur des events si une action se produit (passe à 1 ou 0)
 * @param [in-out] *Input la structure event a modifier
 * @return none
*/
void gestionEvents(Input *);

/**
 * @brief fonction qui modifie le jeu en fonction des evenements, qui teste les possibilités de jeu
 * @param [in-out] *AffichageSdl, *Input, *Jeu
 * @return none
*/
void evolutionJeu(AffichageSdl *, Input *, Jeu *);

/**
 * @brief affiche la main du joueur Actuel
 * @param [in-out] *AffichageSdl
 * @param [in] *Jeu
 * @return none
*/
void affichageMainJoueur(AffichageSdl *, const Jeu *);
/**
 * @brief donne des informations sur l'état du jeu (les evenements en cours)
 * @param [in-out] *AffichageSdl
 * @param [in] *Jeu
 * @return none
*/
void affichageEtatJeu(AffichageSdl *, const Jeu *);
/**
 * @brief affiche la carte piochée
 * @param [in-out] *AffichageSdl
 * @param [in] *Jeu
 * @return none
*/
void affichageCarte(AffichageSdl *, const Jeu *);
/**
 * @brief affiche le tableau noir avec les questions/réponses
 * @param [in-out] *AffichageSdl
 * @param [in] *Jeu
 * @return none
*/
void affichageQuestion(AffichageSdl *, const Jeu *);
/**
 * @brief affiche les informations sur les joueurs (score, niveau, position)
 * @param [in-out] *AffichageSdl
 * @param [in] *Jeu
 * @return none
*/
void affichageSurfaceScore(AffichageSdl *, const Jeu *);
/**
 * @brief affiche tous les joueurs à leur position respective (fait appel a affichageSurfaceJoueur)
 * @param [in] *AffichageSdl
 * @param [in] *Jeu
 * @return none
*/
void affichageTousJoueurs(const AffichageSdl *, const Jeu *);
/**
 * @brief renvoie l'image d'un pion selon l'id du joueur
 * @param [in] *AffichageSdl
 * @param [in] *Joueur
 * @return SDL_Surface l'image du pion
*/
SDL_Surface * affichageSurfaceJoueur(const AffichageSdl *, const Joueur *);
/**
 * @brief affiche l'image du plateau
 * @param [in] *AffichageSdl
 * @param [in] *Jeu
 * @return none
*/
void affichageSurfacePlateau(const AffichageSdl *, const Jeu *);

/**
 * @brief fait appel à toutes les fonctions d'affichage
 * @param [in-out] *AffichageSdl
 * @param [in] *Jeu
 * @return none
*/
void affichageJeu(AffichageSdl *, const Jeu *);
/**
 * @brief la boucle principale qui fait appel à evolutionJeu, affichageJeu, gestionEvent jusqu'à ce qu'on quitte ou que le jeu soit finit
 * @return none
*/
void affichageBoucle();


#endif

